//
//  AccessToken.swift
//  SinaWeiBo
//
//  Created by 谭淇 on 15/3/7.
//  Copyright (c) 2015年 &#35885;&#28103;. All rights reserved.
//

import Foundation

///  AccessToken 是后续所有网络访问的重要依据
class AccessToken: NSObject, NSCoding {
    ///  用于调用access_token，接口获取授权后的access token。
    var access_token: String?
    ///  access_token的生命周期，单位是秒数。
    var expires_in: NSNumber? {
        didSet {
            expiresDate = NSDate(timeIntervalSinceNow: expires_in!.doubleValue)
        }
    }
    ///  access_token的生命周期（该参数即将废弃，开发者请使用expires_in）。
    var remind_in: NSNumber?
    ///  当前授权用户的UID。
    var uid: Int = 0 // 整数类型如果要归档&解档，需要使用Int，NSNumber有时候不太正常
    
    /// MARK:  构造方法: 字典转模型
    // 一但自定义构造方法，默认的init会被覆盖(默认init包括init(coder aDecoder: NSCoder))
    init(dict: NSDictionary) {
        super.init()
        self.setValuesForKeysWithDictionary(dict as [NSObject : AnyObject])
    }
    
    // MARK: token过期处理
    /// 过期时间
    var expiresDate: NSDate?
    /// 是否过期
    var isExpired: Bool {
        return expiresDate?.compare(NSDate()) == NSComparisonResult.OrderedAscending
    }
    
    // MARK: 保存token和加载token
    ///  保存token
    class func saveAccessToken(token: AccessToken) {
        NSKeyedArchiver.archiveRootObject(token, toFile: tokenPath)
    }
    ///  返回沙盒中保存的token
    class func loadAccessToken() -> AccessToken? {
        return NSKeyedUnarchiver.unarchiveObjectWithFile(tokenPath) as? AccessToken
    }
    //// 返回保存在沙盒中的路径
    private class var tokenPath: String {
        var path = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).last as! String
        path = path.stringByAppendingPathComponent("WeiBoAccessToken.plist")
        return path
    }
    
    // MARK: 归档和解档
    // 归档
    func encodeWithCoder(aCoder: NSCoder) {
        aCoder.encodeObject(access_token)
        aCoder.encodeObject(expiresDate)
        aCoder.encodeInteger(uid, forKey: "uid")
    }
    // 解档 required构造函数不能写在分类extension中(分类不具有存储能力)
    // 会覆盖构造函数，外界调用就不能使用init()了 ==> 所有至少要有一个自定义的init方法
    required init(coder aDecoder: NSCoder) {
        super.init()
        access_token = aDecoder.decodeObject() as? String
        expiresDate = aDecoder.decodeObject() as? NSDate
        uid = aDecoder.decodeIntegerForKey("uid")
    }
    
    // 至少要有一个自定义的init方法
    override init() {}
}

////  如果要答应对象信息：类似OC中的description，swift中需要遵守协议DebugPrintable
extension AccessToken: DebugPrintable {
    override var debugDescription: String {
        let dict = self.dictionaryWithValuesForKeys(["access_token", "expiresDate", "uid"])
        return "\(dict)"
    }
}
